local ops = {
    ["+"] = function(a, b) return a + b end,
    ["-"] = function(a, b) return a - b end,
    ["*"] = function(a, b) return a * b end,
    ["/"] = function(a, b) return a / b end
}

function eval(expr)
    local tokens = {}
    for token in expr:gmatch("%S+") do  -- 按空格分割表达式
        table.insert(tokens, token)
    end
    
    print(table.unpack(tokens))

    -- 先计算高优先级运算（* /）
    for i = #tokens, 1, -1 do
        local token = tokens[i]
        if token == "*" or token == "/" then
            local a, op, b = tonumber(tokens[i-1]), token, tonumber(tokens[i+1])
            tokens[i-1] = ops[op](a, b)  -- 替换结果为新操作数
            table.remove(tokens, i)   -- 移除操作符
            table.remove(tokens, i)   -- 移除右操作数
        end
    end
    
    -- 计算剩余低优先级运算（+ -）
    local result = tonumber(tokens[1])
    for i = 2, #tokens, 2 do
        result = ops[tokens[i]](result, tonumber(tokens[i+1]))
    end
    return result
end

print(eval("5 * 3 + 2 * 2"))  -- 17 [综合应用]